package com.itheima.relfect;


import com.itheima.domain.Student;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

/**
 * 写一个框架类 在不改变任何代码的前提下 创建任意对象并执行方法
 *
 *      步骤：
 *          将创建的对象的全类名和方法名称封装到配置文件中
 *          在程序中加载配置文件
 *          使用反射加载类并创建对象和方法
 */
public class ReflectTest {
    public static void main(String[] args) throws IOException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException {
        //加载配置文件
        //用类加载器获取配置文件路径 类加载器能找到 src 下的文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        String path = classLoader.getResource("pro.properties").getPath();
        path = URLDecoder.decode(path, "UTF-8");
        System.out.println(path);
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
        Properties properties = new Properties() ;
        properties.load(resourceAsStream);

        //获取数据
        String className = properties.getProperty("className") ;
        String methodName = properties.getProperty("methodName") ;

        //加载类进内存
        Class cls = Class.forName(className) ;

        //获取构造方法
        Constructor constructor = cls.getConstructor();

        Object o = constructor.newInstance();

        //获取成员方法
        Method method = cls.getDeclaredMethod(methodName);
        method.setAccessible(true);
        method.invoke(o);
    }
}
